/*
 * @ Created with Clion
 * @ Author Morbid
 * @ Date 2022/07/28
 * @ Time 9:28
 */

/*!
 * 定义队列顺序存储
 * 实现顺序队列基本操作
 */


#define MaxSize 10
typedef int ElemType;

typedef struct {
    ElemType data[MaxSize];
    int front, rear;
} SqQueue;

/*!
 * 队列初始化
 * @param Q 队列
 */
void InitQueue(SqQueue &Q) {
    Q.front = Q.rear = 0;
}

/*!
 * 判断队列是否为空
 * @param Q 队列
 * @return 如果队列为空返回true,否则返回false
 */
bool QueueEmpty(SqQueue Q) {
    if (Q.front == Q.rear)
        return true;
    else
        return false;
}

/*!
 *入队
 * @param Q 队列
 * @param x 入队元素
 * @return 入队成功返回true，否则返回false
 */
bool EnQueue(SqQueue &Q, ElemType x) {
    if ((Q.rear + 1) % MaxSize == Q.front)
        return false;
    Q.data[Q.rear] = x;
    Q.rear = (Q.rear + 1) % MaxSize;
    return true;
}

/*!
 * 出队
 * @param Q 队列
 * @param x 存放出队元素的变量
 * @return 出队成功返回true，否则返回false
 */
bool DeQueue(SqQueue &Q, ElemType &x) {
    if (QueueEmpty(Q))
        return false;
    x = Q.data[Q.front];
    Q.front = (Q.front + 1) % MaxSize;
    return true;
}

/*!
 * 获取对头元素
 * @param Q 队列
 * @param x 存放获取到的元素变量
 * @return 获取成功返回true，否则返回false
 */
bool GetHead(SqQueue Q, ElemType &x) {
    if (QueueEmpty(Q))
        return false;
    x = Q.data[Q.front];
    return true;
}